HIVE 增加修改删除字段 |
您所在的位置:网站首页 › hive replace替换多个字段 › HIVE 增加修改删除字段 |
HIVE 增加修改删除字段
非分区表增加字段修改字段(修改字段名称、类型、注释、顺序)删除字段
分区表新增字段修改字段(change column)替换字段(replace column)
非分区表
增加字段
增加字段可以使我们在所有字段之后和分区字段之间增加一个字段 使用示例,在 user_info 中增加 user_addr 字段,现有的表数据如下:
结论:非分区表新增字段后,原有数据的该字段会显示为 NULL,新增的数据会按新增的数据进行展示
修改前 修改字段 user_addr 的字段名称为 user_address ALTER TABLE user_info CHANGE user_addr user_address string;
修改 is_active 字段的类型为 string,修改前为 int ALTER TABLE user_info CHANGE is_active is_active string;修改 user_address 字段的中文注释 ALTER TABLE user_info CHANGE user_address user_address STRING COMMENT '修改字段注释';注意:以上的修改,仅仅是实现了修改元数据,实际的 HDFS 文件并没有修改,这个很关键 删除字段HIVE 不能直接删除字段,且删除字段的操作有很大的局限性,一般尽量删除后面的字段,但是如果直接从中间删除,可能会出出现错位的情况。而且尽量不要有删除字段的操作
首先我们创建一张分区表 CREATE TABLE IF NOT EXISTS cust_info ( user_id string COMMENT '用户ID' ,user_name string COMMENT '用户姓名' ,user_age string COMMENT '用户年龄' ) COMMENT '客户信息表' PARTITIONED BY (ds STRING COMMENT'分区') ; INSERT OVERWRITE TABLE cust_info partition(ds = '20220223') SELECT '001' as user_id, 'kyle' as user_name, '23' as user_age UNION ALL SELECT '002' as user_id, 'lisa' as user_name, '25' as user_age ;我们新增一个字段 user_addr 字段试试 ALTER TABLE cust_info ADD COLUMNS (user_addr string COMMENT '用户地址') ;新增完毕后,我们发现 20220223 分区中的数据 user_addr 列已经出现了,而且该列的值全部为 NULL 插入数据后重新查看,发现该列的值仍然为 NULL ,这是怎么回事
我们删除表结构,然后重新插入数据并执行新增字段操作试试 ALTER TABLE cust_info ADD COLUMNS (user_addr string COMMENT '用户地址') CASCADE ;
另外一种方法:先删除分区,然后重新插入数据(我司的解决办法) 修改字段(change column)HIVE ALTER COLUMN 官方介绍 SPARK ALTER COLUMN 官方介绍 注意,博主使用的是 HIVE ON MR - HIVE 2.1 语法介绍 ALTER TABLE table_name [PARTITION partition_spec] CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name] [CASCADE|RESTRICT];This command will allow users to change a column’s name, data type, comment, or position, or an arbitrary combination of them. The PARTITION clause is available in Hive 0.14.0 and later; see Upgrading Pre-Hive 0.13.0 Decimal Columns for usage. A patch for Hive 0.13 is also available (see HIVE-7971). 通过该语法用户可以修改字段的名称、类型、注释、分区,可以组合修改 注意,CASCADE 和 RESTRICT(默认) 的区别,CASCADE不仅修改元数据,还将作用于历史分区。RESTRICT仅修改元数据,但是会对新建的分区生效 使用示例 -- 先建表插数 CREATE TABLE IF NOT EXISTS customer_info ( user_id string COMMENT '用户ID' ,user_name string COMMENT '用户姓名' ,user_age int COMMENT '用户年龄' ) COMMENT '客户信息表' PARTITIONED BY (ds STRING COMMENT'分区') ; INSERT OVERWRITE TABLE customer_info partition(ds = '20220223') SELECT '001' as user_id, 'kyle' as user_name, 23 as user_age UNION ALL SELECT '002' as user_id, 'lisa' as user_name, 25 as user_age ; -- 修改 user_id 字段为 id ALTER TABLE customer_info CHANGE user_id id string;REPLACE COLUMNS 删除所有现有的字段列表并替换为新的字段列表。 这只能用于具有本地的序列化 SerDe(DynamicSerDe、MetadataTypedColumnsetSerDe、LazySimpleSerDe 和 ColumnarSerDe)的表。 使用示例 -- 先建表插数 CREATE TABLE IF NOT EXISTS customer_info ( user_id string COMMENT '用户ID' ,user_name string COMMENT '用户姓名' ,user_age int COMMENT '用户年龄' ) COMMENT '客户信息表' PARTITIONED BY (ds STRING COMMENT'分区') ; INSERT INTO customer_info partition(ds = '20220223') VALUES('001', 'kyle', 23),('002', 'jack', 24); INSERT INTO customer_info partition(ds = '20220224') VALUES('003', 'lisa', 23); -- 将三个字段全部替换 ALTER TABLE customer_info REPLACE COLUMNS (ecif string, name string COMMENT 'new comment', age_info int);
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |